using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Configuration;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Configuration;

namespace Pay.Core {
	public class WebHelper {
		public static string GetIP() {
			string str = string.Empty;
			if (HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null) {
				str = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
			} else {
				str = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();
			}
			if (!(!string.IsNullOrEmpty(str) && ValidateHelper.IsIP(str))) {
				str = "127.0.0.1";
			}
			return str;
		}

		public static NameValueCollection GetParmList(string data) {
			NameValueCollection values = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
			if (!string.IsNullOrEmpty(data)) {
				int length = data.Length;
				for (int i = 0; i < length; i++) {
					string str;
					string str2;
					int startIndex = i;
					int num4 = -1;
					while (i < length) {
						char ch = data[i];
						if (ch == '=') {
							if (num4 < 0) {
								num4 = i;
							}
						} else if (ch == '&') {
							break;
						}
						i++;
					}
					if (num4 >= 0) {
						str = data.Substring(startIndex, num4 - startIndex);
						str2 = data.Substring(num4 + 1, (i - num4) - 1);
					} else {
						str = data.Substring(startIndex, i - startIndex);
						str2 = string.Empty;
					}
					values[str] = str2;
					if ((i == (length - 1)) && (data[i] == '&')) {
						values[str] = string.Empty;
					}
				}
			}
			return values;
		}

		public static string GetRawUrl() {
			return HttpContext.Current.Request.RawUrl;
		}

		public static string GetUrl() {
			return HttpContext.Current.Request.Url.ToString();
		}

		public static string GetUrlReferrer() {
			Uri urlReferrer = HttpContext.Current.Request.UrlReferrer;
			if (urlReferrer == null) {
				return string.Empty;
			}
			return urlReferrer.ToString();
		}

		public static string HtmlDecode(string s) {
			return HttpUtility.HtmlDecode(s);
		}

		public static string HtmlEncode(string s) {
			return HttpUtility.HtmlEncode(s);
		}

		public static bool IsAjax() {
			return (HttpContext.Current.Request.Headers["X-Requested-With"] == "XMLHttpRequest");
		}

		public static bool IsMobile() {
			if (HttpContext.Current.Request.Browser.IsMobileDevice) {
				return true;
			}
			bool result = false;
			return (bool.TryParse(HttpContext.Current.Request.Browser["IsTablet"], out result) && result);
		}

		/// <summary>
		/// 去除url中的param参数的函数
		/// </summary>
		/// <param name="url"></param>
		/// <param name="paramsters"></param>
		/// <returns></returns>
		public static string BuildUrl(string url, params string[] paramsters) {
			string baseUrl = string.Empty;
			NameValueCollection nvc = null;
			ParseUrl(url, out baseUrl, out nvc);
			if (nvc.Count > 0) { foreach (var param in paramsters) nvc.Remove(param); }
			if (nvc.Count > 0) {
				for (int i = 0; i < nvc.Count; i++) {
					if (i == 0) baseUrl += "?" + nvc.GetKey(i) + "=" + nvc[i];
					else baseUrl += "&" + nvc.GetKey(i) + "=" + nvc[i];
				}
			}
			return baseUrl;
		}

		/// <summary>
		/// 分析 url 字符串中的参数信息
		/// </summary>
		/// <param name="url">输入的 URL</param>
		/// <param name="baseUrl">输出 URL 的基础部分</param>
		/// <param name="nvc">输出分析后得到的 (参数名,参数值) 的集合</param>
		public static void ParseUrl(string url, out string baseUrl, out NameValueCollection nvc) {
			if (url == null)
				throw new ArgumentNullException("url");

			nvc = new NameValueCollection();
			baseUrl = "";

			if (url == "")
				return;

			int questionMarkIndex = url.IndexOf('?');

			if (questionMarkIndex == -1) {
				baseUrl = url;
				return;
			}
			baseUrl = url.Substring(0, questionMarkIndex);
			if (questionMarkIndex == url.Length - 1)
				return;
			string ps = url.Substring(questionMarkIndex + 1);

			// 开始分析参数对    
			Regex re = new Regex(@"(^|&)?(\w+)=([^&]+)(&|$)?", RegexOptions.Compiled);
			MatchCollection mc = re.Matches(ps);

			foreach (Match m in mc) {
				nvc.Add(m.Result("$2").ToLower(), m.Result("$3"));
			}
		}

		public static string UrlDecode(string s) {
			return HttpUtility.UrlDecode(s);
		}

		public static string UrlEncode(string s) {
			return HttpUtility.UrlEncode(s);
		}

		public static void DeleteCookie(string name) {
			HttpCookie cookie = new HttpCookie(name) {
				Expires = DateTime.Now.AddYears(-1)
			};
			HttpContext.Current.Response.AppendCookie(cookie);
		}

		public static string GetCookie(string name) {
			if (HttpContext.Current == null) return string.Empty;
			HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
			if (cookie != null) {
				return cookie.Value;
			}
			return string.Empty;
		}

		public static long GetId(string name) {
			var result = GetCookie(name);
			if (result == string.Empty) return 0;
			return long.Parse(result);
		}

		public static string GetCookie(string name, string key) {
			HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
			if ((cookie != null) && cookie.HasKeys) {
				string str = cookie[key];
				if (str != null) {
					return str;
				}
			}
			return string.Empty;
		}

		public static void SetCookie(string name, string value) {
			HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
			if (cookie != null) {
				cookie.Value = value;
			} else {
				cookie = new HttpCookie(name, value);
			}
			cookie.Expires = DateTime.MaxValue;
			HttpContext.Current.Response.AppendCookie(cookie);
		}

		public static void SetCookie(string name, string value, DateTime dt) {
			HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
			if (cookie == null) {
				cookie = new HttpCookie(name);
			}
			cookie.Value = value;
			cookie.Expires = dt;
			HttpContext.Current.Response.AppendCookie(cookie);
		}

		public static void SetCookie(string name, string key, string value) {
			HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
			if (cookie == null) {
				cookie = new HttpCookie(name);
			}
			cookie[key] = value;
			HttpContext.Current.Response.AppendCookie(cookie);
		}

		public static void SetCookie(string name, string key, string value, DateTime dt) {
			HttpCookie cookie = HttpContext.Current.Request.Cookies[name];
			if (cookie == null) {
				cookie = new HttpCookie(name);
			}
			cookie[key] = value;
			cookie.Expires = dt;
			HttpContext.Current.Response.AppendCookie(cookie);
		}

		public static void SetUserCookie(long userId) {
			SetCookie("mall_userid", SecureHelper.AESEncrypt(userId.ToString()));
		}
		public static long GetUserCookie() {
			string mall_userid = GetCookie("mall_userid");
			if (mall_userid == string.Empty) return 0;
			string user_id = SecureHelper.AESDecrypt(mall_userid);
			if (!string.IsNullOrEmpty(user_id))
				return long.Parse(user_id);
			return 0;
		}
		public static long? GetShareId() {
			long mall_openid = GetUserCookie();
			if (mall_openid == 0) return null;
			return mall_openid;
		}
		public static void SetOpenIdCookie(string openid) {
			SetCookie("openid", SecureHelper.AESEncrypt(openid));
		}
		public static string GetOpenIdCookie() {
			string mall_openid = GetCookie("openid");
			if (mall_openid == string.Empty) return string.Empty;
			return SecureHelper.AESDecrypt(mall_openid);
		}

		public static string GetPasswrodWithTwiceEncode(string password, string salt) {
			return SecureHelper.MD5(SecureHelper.MD5(password) + salt);
		}

		public static string MachineKey() {
			/**////打开web.config文件，写入新生成的machineKey
			Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
			MachineKeySection configSection = (MachineKeySection)config.GetSection("system.web/machineKey");
			configSection.ValidationKey = CreateKey(64);
			configSection.DecryptionKey = CreateKey(24);
			configSection.Validation = MachineKeyValidation.SHA1;
			if (!configSection.SectionInformation.IsLocked) {
				config.Save();
				return "写入成功！";
			} else {
				return "写入失败！段被锁定！";
			}
		}

		public static string CreateKey(int numBytes) {
			RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
			byte[] buff = new byte[numBytes];
			rng.GetBytes(buff);
			System.Text.StringBuilder hexString = new System.Text.StringBuilder(64);
			for (int i = 0; i < buff.Length; i++) {
				hexString.Append(String.Format("{0:X2}", buff[i]));
			}
			return hexString.ToString();
		}

		#region 获取web客户端ip
		/// <summary>
		/// 获取web客户端ip
		/// </summary>
		/// <returns></returns>
		public static string GetWebClientIp() {

			string userIP = "未获取用户IP";

			try {
				if (System.Web.HttpContext.Current == null
			|| System.Web.HttpContext.Current.Request == null
			|| System.Web.HttpContext.Current.Request.ServerVariables == null)
					return "";

				string CustomerIP = "";

				//CDN加速后取到的IP simone 090805
				CustomerIP = System.Web.HttpContext.Current.Request.Headers["Cdn-Src-Ip"];
				if (!string.IsNullOrEmpty(CustomerIP)) {
					return CustomerIP;
				}

				CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];


				if (!String.IsNullOrEmpty(CustomerIP))
					return CustomerIP;

				if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"] != null) {
					CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
					if (CustomerIP == null)
						CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
				} else {
					CustomerIP = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

				}

				if (string.Compare(CustomerIP, "unknown", true) == 0)
					return System.Web.HttpContext.Current.Request.UserHostAddress;
				return CustomerIP;
			} catch { }

			return userIP;

		}
		#endregion

		#region 地区编号
		public static Dictionary<string, string> GetAreaCode() {
			Dictionary<string, string> codes = new Dictionary<string, string>();
			codes.Add("大陸", "86");
			//codes.Add("安哥拉","244");
			//codes.Add("阿富汗","93");
			//codes.Add("阿尔巴尼亚","355");
			//codes.Add("阿尔及利亚","213");
			//codes.Add("安道尔共和国","376");
			//codes.Add("安圭拉岛","1264");
			//codes.Add("安提瓜和巴布达","1268");
			//codes.Add("阿根廷","54");
			//codes.Add("亚美尼亚","374");
			//codes.Add("啊森松","247");
			//codes.Add("澳大利亚","61");
			//codes.Add("奥地利","43");
			//codes.Add("阿塞拜疆","994");
			//codes.Add("巴哈马","1242");
			//codes.Add("巴林","973");
			//codes.Add("孟加拉国","880");
			//codes.Add("巴巴多斯","1246");
			//codes.Add("白俄罗斯","375");
			//codes.Add("比利时","32");
			//codes.Add("伯利兹","501");
			//codes.Add("贝宁","229");
			//codes.Add("百慕大群岛","1441");
			//codes.Add("玻利维亚","591");
			//codes.Add("博茨瓦纳","267");
			//codes.Add("巴西","55");
			//codes.Add("文莱","673");
			//codes.Add("保加利亚","359");
			//codes.Add("布基纳法索","226");
			//codes.Add("缅甸","95");
			//codes.Add("布隆迪","257");
			//codes.Add("喀麦隆","237");
			//codes.Add("加拿大","1");
			//codes.Add("开曼群岛","1345");
			//codes.Add("中非共和国","236");
			//codes.Add("咋得","235");
			//codes.Add("智利","56");
			//codes.Add("哥伦比亚","57");
			//codes.Add("刚果", "242");
			//codes.Add("库克群岛", "682");
			//codes.Add("哥斯达黎加", "506");
			//codes.Add("古巴", "53");
			//codes.Add("塞浦路斯", "357");
			//codes.Add("捷克", "420");
			//codes.Add("丹麦", "45");
			//codes.Add("吉布提", "253");
			//codes.Add("多米尼加共和国", "1890");
			//codes.Add("厄瓜多尔", "593");
			//codes.Add("埃及", "20");
			//codes.Add("萨尔瓦多", "503");
			//codes.Add("爱沙尼亚","372");
			//codes.Add("埃塞俄比亚", "251");
			//codes.Add("斐济", "679");
			//codes.Add("芬兰", "358");
			//codes.Add("法国", "33");
			//codes.Add("法属圭亚那", "594");
			//codes.Add("加蓬", "241");
			//codes.Add("冈比亚", "220");
			//codes.Add("格鲁吉亚", "995");
			//codes.Add("德国", "49");
			//codes.Add("加纳", "233");
			//codes.Add("直布罗陀", "350");
			//codes.Add("希腊", "30");
			//codes.Add("格林纳达", "1809");
			//codes.Add("关岛", "1671");

			//codes.Add("危地马拉", "502");
			//codes.Add("几内亚", "224");
			//codes.Add("圭亚那", "592");
			//codes.Add("海地", "509");
			//codes.Add("洪都拉斯", "504");
			//codes.Add("香港", "852");
			//codes.Add("匈牙利", "36");
			//codes.Add("冰岛", "354");
			//codes.Add("印度", "91");
			//codes.Add("印度尼西亚", "62");
			//codes.Add("伊朗", "98");
			//codes.Add("伊拉克", "964");
			//codes.Add("爱尔兰", "353");
			//codes.Add("以色列", "972");
			//codes.Add("意大利", "39");

			//codes.Add("科特迪瓦","225");
			//codes.Add("牙买加", "1876");
			//codes.Add("日本", "81");
			//codes.Add("约旦", "962");
			//codes.Add("柬埔寨", "855");
			//codes.Add("哈萨克斯坦", "327");
			//codes.Add("肯尼亚", "254");
			//codes.Add("韩国", "82");
			//codes.Add("科威特", "965");
			//codes.Add("吉尔吉斯坦", "331");
			//codes.Add("老挝", "856");
			//codes.Add("拉脱维亚", "371");
			//codes.Add("黎巴嫩", "961");
			//codes.Add("莱索托", "266");
			//codes.Add("利比里亚", "231");
			//codes.Add("利比亚", "218");

			//codes.Add("列支敦士登", "423");
			//codes.Add("立陶宛", "370");
			//codes.Add("卢森堡", "352");
			//codes.Add("澳门", "853");
			//codes.Add("马达加斯加", "261");
			//codes.Add("马拉维", "265");
			//codes.Add("马来西亚", "60");
			//codes.Add("马尔代夫", "960");
			//codes.Add("马里", "223");
			//codes.Add("马耳他", "356");
			//codes.Add("马里亚那群岛", "1670");
			//codes.Add("马提尼克", "596");
			//codes.Add("毛里求斯", "230");
			//codes.Add("墨西哥", "52");
			//codes.Add("摩尔多瓦", "373");
			//codes.Add("摩纳哥", "377");

			//codes.Add("蒙古", "976");
			//codes.Add("蒙特塞拉特岛", "1664");
			//codes.Add("摩洛哥", "212");
			//codes.Add("莫桑比克", "258");
			//codes.Add("纳米比亚", "264");
			//codes.Add("瑙鲁", "674");
			//codes.Add("尼泊尔", "977");
			//codes.Add("荷属安的列斯", "599");
			//codes.Add("荷兰", "31");
			//codes.Add("新西兰", "64");
			//codes.Add("尼加拉瓜", "505");
			//codes.Add("尼日尔", "227");
			//codes.Add("尼日利亚", "234");
			//codes.Add("朝鲜", "850");
			//codes.Add("挪威", "47");
			//codes.Add("阿曼", "968");

			//codes.Add("巴基斯坦", "92");
			//codes.Add("巴拿马", "507");
			//codes.Add("巴布亚新几内亚", "675");
			//codes.Add("巴拉圭", "595");
			//codes.Add("秘鲁", "51");
			//codes.Add("菲律宾", "63");
			//codes.Add("波兰", "48");
			//codes.Add("法属玻利尼西亚", "689");
			//codes.Add("葡萄牙", "351");
			//codes.Add("波多黎各", "1787");
			//codes.Add("卡塔尔", "974");
			//codes.Add("留尼旺", "262");
			//codes.Add("罗马尼亚", "40");
			//codes.Add("俄罗斯", "7");
			//codes.Add("圣文森特岛", "1784");

			//codes.Add("东萨摩亚", "684");
			//codes.Add("西萨摩亚", "685");
			//codes.Add("圣马力诺", "378");
			//codes.Add("圣多美和普林西比", "239");
			//codes.Add("沙特阿拉伯", "966");
			//codes.Add("塞内加尔", "221");
			//codes.Add("塞舌尔", "248");
			//codes.Add("塞拉利昂", "232");
			//codes.Add("新加坡", "65");
			//codes.Add("斯洛伐克", "421");
			//codes.Add("斯洛文尼亚", "386");
			//codes.Add("所罗门群岛", "677");
			//codes.Add("索马里", "252");
			//codes.Add("南非", "27");
			//codes.Add("西班牙", "34");
			//codes.Add("斯里兰卡", "94");

			//codes.Add("圣卢西亚", "1758");
			//codes.Add("圣文森特", "1784");
			//codes.Add("苏丹", "249");
			//codes.Add("苏里南", "597");
			//codes.Add("斯威士兰", "268");
			//codes.Add("瑞典", "46");
			//codes.Add("瑞士", "41");
			//codes.Add("叙利亚", "963");
			codes.Add("台灣", "886");
			//codes.Add("塔吉克斯坦", "992");
			//codes.Add("坦桑尼亚", "255");
			//codes.Add("泰国", "66");
			//codes.Add("多哥", "228");
			//codes.Add("汤加", "676");
			//codes.Add("特立尼达和多巴哥", "1809");
			//codes.Add("突尼斯", "216");
			//codes.Add("土耳其", "90");
			//codes.Add("土库曼斯坦", "993");
			//codes.Add("乌干达", "256");
			//codes.Add("乌克兰", "380");
			//codes.Add("阿拉伯联合酋长国", "971");
			//codes.Add("英国", "44");
			//codes.Add("美国", "001");
			//codes.Add("乌拉圭", "598");
			//codes.Add("乌兹别克斯坦", "233");
			//codes.Add("委内瑞拉", "58");
			//codes.Add("越南", "84");
			//codes.Add("也门", "967");
			//codes.Add("南斯拉夫", "381");
			//codes.Add("津巴布韦", "263");
			//codes.Add("扎伊尔", "243");
			//codes.Add("赞比亚", "260");
			return codes;
		}
		#endregion
	}
}

